# coding=utf-8
import errno
import random

import logging
from flask import abort
from flask import json
from flask import make_response
from flask import request, jsonify, current_app

from iHome import constants
from iHome import redis_store
from iHome.models import User
from iHome.utils.response_code import RET
from iHome.utils.sms import CCP
from . import api
import re
# TODO 图片验证和短信发送

@api.route('/send_chid',methods=['POST'])
def send_chid():
    """发送短信"""
    # 获取参数
    json_data = request.data
    dict_data = json.loads(json_data)
    # 获取手机号
    mobile = dict_data.get('mobile')
    print mobile
    # 获取图片验证 码
    image_code = dict_data.get('imagecode')
    print image_code
    # 验证码的编号
    image_code_id = dict_data.get('imagecodeid')
    print image_code_id
    # 验证参数
    if not all([mobile, image_code, image_code_id]):
        return jsonify(errno=RET.PARAMERR, errmsg='参数不完整')

    if not re.match(r'^1([358][0-9]|4[579]|66|7[0135678]|9[89])[0-9]{8}$', mobile):
        return jsonify(errno=RET.PARAMERR, errmsg='手机号码不正确')
    # 验证手机号码是否已经存在
    if User.query.filter_by(mobile=mobile).first():
        return jsonify(errno=RET.DATAERR, errmsg='该手机号已经注册')
    # 验证码是否存在redis
    try:
        real_image_code = redis_store.get('imagecode' + image_code_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DATAERR, errmsg='查询数据库失败')

    # 验证码过期
    if not real_image_code:
        return jsonify(errno=RET.NODATA, errmsg='验证码过期')
    # 图片验证码错误    # 对比redis中的image_codeid ,如果是一样的，就发送短信

    if real_image_code.lower() != image_code.lower():
        return jsonify(errno=RET.DATAERR, errmsg='图片验证码错误')

    # 6 生成短信验证码
    sms_code = "%06d" % random.randint(0, 1000000)
    current_app.logger.error(sms_code)
    try:
        # 往reids中保存手机号， 过期时间，
        redis_store.setex('SMSCode_' + mobile, constants.SMS_CODE_REDIS_EXPIRES, sms_code)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='保存短信验证码失败')

    # 7. 发送短信验证码&记录发送结果
    result = CCP().send_template_sms(mobile, [sms_code, constants.SMS_CODE_REDIS_EXPIRES / 60], '1')
    print('result',result)
    if result == 1:
        return jsonify(errno=RET.OK, errmsg='发送验证码成功')
    else:
        return jsonify(errno=RET.THIRDERR, errmsg='发送验证码失败')
    # 返回响应
    # return jsonify(errno=RET.OK, errmsg='发送验证码成功')


@api.route('/image_code')
def return_image_code():
    # 获取参数
    cur_image_id = request.args.get('cur')
    if not cur_image_id:
        abort(403)
    print(1111, cur_image_id)

    pre_image_id = request.args.get('pre')
    print(222, pre_image_id)
    # 生成验证码
    from iHome.utils.captcha.captcha import captcha
    name, text, image = captcha.generate_captcha()
    current_app.logger.error(text)
    # 删除之前验证码并保存当前验证码
    try:
        redis_store.delete('imagecode' + pre_image_id)
        # print 12324
        # redis_store.set(key,value,过期时间)
        # redis.store.setex(key,过期时间,value)
        redis_store.set('imagecode' + cur_image_id, text, constants.IMAGE_CODE_REDIS_EXPIRES)
        # print 67890
    except Exception as e:
        # 错误处理
        # print(e)
        current_app.logger.error(e)
        # 响应返回

        return make_response(jsonify(errno=RET.DATAERR, errmsg='图片验证码保存失败'))

    else:

        response = make_response(image)
        response.headers['Content-Type'] = 'image/jpg'
        # 返回图片验证码
        return response
